//第一步:引入插件
import VueRouter from "vue-router";
//第二步：引入Vue
import Vue from "vue";
//第三步：使用插件
Vue.use(VueRouter);

import routes from '@/router/routes';

//引入仓库：token判断用户是否登录  userInfo可以判断仓库是否拥有用户信息
import store from '@/store';


//注意:虽然是重写push|replace方法,最终实现路由跳转与传递参数，起始还是用人家原来的push方法

//先把人家原有备份一份--原始push
let originPush = VueRouter.prototype.push;

//备份原始replace
let originReplace = VueRouter.prototype.replace;

//重写push方法
VueRouter.prototype.push = function (location, resolve, reject) {
  //面试题:call与apply区别?
  //相同点:都可以让当前函数执行一次
  //不同点：call传递参数用逗号隔开，apply，传递参数数组
  //call第一个参数:this
  if (resolve && reject) {
    originPush.call(this, location, resolve, reject);
  } else {
    originPush.call(this, location, () => { }, () => { });
  }
}

//重写replace方法
VueRouter.prototype.replace = function (location, resolve, reject) {
  //判断
  if (resolve && reject) {
    originReplace.call(this, location, resolve, reject);
  } else {
    originReplace.call(this, location, () => { }, () => { });
  }
}


//箭头函数
const withRouter = () => {
  return new VueRouter({
    //一个路由器:管理多个路由
    routes,
    //滚动行为:当路由进行切换跳转的时候，可以设置滚动条的位置
    scrollBehavior() {
      //这里可以设置x轴，目前咱们项目没有x轴
      return { y: 0 };
    }
  })
}

const router = withRouter();

//全局守卫:用户它范围谁，守卫都需要查看一下！！！！

//全局前置守卫
router.beforeEach(async (to, from, next) => {
  //为了测试暂时全部都放行
  // next();
  //to[跳转到哪里的那个路由对象] name、query、params、meta、path
  //from[从哪个路由而来,那个路由对象]
  //next:它并非是路由对象，它是一个函数.放行函数
  //next函数调用写法:
  //第一种:next(),路由跳转的时候放行！！！！！
  //第二种写法:next('路径')
  //判断用户是否登录---token【登录一定拥有token】
  let hasToken = store.state.user.token;
  //千万别通过空对象判断，因为空对象也是真的，通过对象的属性有没有去判断
  let hasUserInfo = store.state.user.userInfo.loginName;

  //用户登录
  if (hasToken) {
    //用户登陆了,且还想去登录页！！！！浏览器首页
    if (to.path == '/login') {
      next('/home');
    } else {
      //用户登陆了，但是去的并非login
      if (hasUserInfo) {
        //用户登陆了,去的并非login,用户信息有我在放行
        next();
      } else {
        try {
          //用户登陆了，去的并非login,但是没有获取到用户信息,发请求获取用户信息
          await store.dispatch('getUserInfo');
          //获取用户信息成功放行
          next();
        } catch (error) {
          //用户登陆了,没有用户信息发请求获取用户信息（失败）：token过期了！！！！用户重新登录
          //第一步:清除用户信息相关内容
          await store.dispatch('logout');
          //返回登录页
          next('/login');
        }
      }
    }
  } else {
    //用户未登录:想去交易、支付(pay)、支付成功(paysuccess)、个人中心->登录页面
    let toPath = to.path;
    //未登录：去交易、支付(pay)、支付成功(paysuccess)、个人中心->登录页面
    if (toPath.indexOf('trade') != -1 || toPath.indexOf('pay') != -1 || toPath.indexOf('center') != -1) {
       console.log(toPath);   
      next('/login?redirect='+toPath);
    } else {
      //未登录：去其他页面
      next();
    }
  }





});

//全局后置守卫:
router.afterEach((to, from) => {
  // console.log('全局后置守卫')
})






//第四步：暴露VueRouter类的实例
export default router;